package cn.tedu.pdfamily.product.service.impl;

import cn.tedu.pdfamily.product.exception.ServiceException;
import cn.tedu.pdfamily.product.mapper.CommentMapper;
import cn.tedu.pdfamily.product.pojo.dto.CommentAddNewDTO;
import cn.tedu.pdfamily.product.pojo.entity.Comment;
import cn.tedu.pdfamily.product.pojo.vo.CommentListItemVO;
import cn.tedu.pdfamily.product.pojo.vo.CommentStandardVO;
import cn.tedu.pdfamily.product.service.ICommentService;
import cn.tedu.pdfamily.product.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 处理评论数据的业务实现类, 此处实现文件夹外对应的接口中的方法
 *
 * @author Half_Summer
 * @version 0.0.1
 */
@Slf4j
@Service("CommentServiceImpl")
public class CommentServiceImpl implements ICommentService {

    //注入CommentMapper接口
    @Autowired
    private CommentMapper commentMapper;

    //输出日志: 对象已创建
    public CommentServiceImpl(){
        log.debug("业务对象创建: CommentServiceImpl.");
    }

    //[方法] 新增评论
    public void addNewComment(CommentAddNewDTO commentAddNewDTO){
        log.debug("准备新增评论, 参数:{}",commentAddNewDTO);
        //从参数中获取用户id和所评价的商品id,以查询用户是否已经评论过该商品
        Long commentUserId=commentAddNewDTO.getUserId();
        Long productId= commentAddNewDTO.getProductId();
        //打点输出检查是否成功获取对应信息
        log.debug("检查用户{}是否已经评论过商品(id={})",commentUserId,productId);
        //检查是否存在查询结果
        int count=commentMapper.countByUserIdAndProductId(commentUserId,productId);
        if(count>0){
            //存在查询结果, 用户已经评论过了
            String message="新增评论失败, 用户id= "+commentUserId+" 已评论过商品 "+productId+" .";
            log.debug(message);
            //抛出异常50000
            throw new ServiceException(ServiceCode.ERR_INSERT,message);
        }
        //用户没有评论过商品, 准备新增评论
        log.debug("用户没有评论过商品(id={}), 准备新增评论...",productId);
        //新建评论对象
        Comment comment = new Comment();
        //将传来的对象中的参数复制到新建对象中
        BeanUtils.copyProperties(commentAddNewDTO,comment);
        //将复制完属性的comment对象添加到数据库
        log.debug("准备将新增评论{}添加到数据库...",comment);
        //判断是否成功添加
        int rows=commentMapper.insertComment(comment);
        if(rows!=1){
            //数据没有成功添加
            String message="未知异常(1): 新增评论失败, 请稍后重试.";
            log.debug(message);
            //抛出异常50000
            throw new ServiceException(ServiceCode.ERR_INSERT,message);
        }
        log.debug("新增评论完成.");
        //没有异常将会在Controller中返回JsonResult.ok
    }

    //[方法] 根据评论id删除评论
    public void deleteCommentById(Long id){
        log.debug("准备删除评论, 参数:{}",id);
        //根据参数中的id查询评论
        CommentStandardVO commentStandardVO=commentMapper.getStandardById(id);
        //判断评论是否存在
        if(commentStandardVO==null){
            //评论不存在, 无法删除, 抛出异常
            String message="删除评论失败, 评论不存在.";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_DELETE,message);
        }
        //评论存在, 准备删除评论
        log.debug("准备删除评论(id={})",id);
        int rows=commentMapper.deleteById(id);
        //判断是否成功删除
        if(rows!=1){
            //评论没有成功删除
            String message="未知异常(1): 删除评论失败, 请稍后重试";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_DELETE,message);
        }
    }

    //[方法] 将所有评论列出
    public List<CommentListItemVO> commentList(){
        log.debug("准备列出所有评论...");
        return commentMapper.list();
    }
}
